// 1.根域名配置
// 2.超时时间
// 3.请求拦截
// 后端返回的接口数据

// 使用TS二次封装axios，添加拦截器和类型约束
import axios from 'axios'
import type { AxiosRequestConfig, Method, HttpStatusCode } from 'axios'
import { getToken } from './token'
// http://geek.itheima.net/v1_0/channels
// 创建axios实例对象并进行基础配置
const service = axios.create({
  baseURL: 'http://geek.itheima.net/v1_0',
  timeout: 5000
})

// 设置请求拦截器，一般用来设置请求头，如token等
service.interceptors.request.use(
  config => {
    // 添加请求头等操作
    // 操作token
    // 按照后端的格式要求
    const token=getToken()
    console.log('88881',token);
    
    if(token){
      config.headers.Authorization=`Bearer ${token}`
    }
    
    return config
  },
  error => Promise.reject(error)
)

// 设置响应拦截器，一般用来处理后台返回的数据
service.interceptors.response.use(
  response => response.data,
  error => Promise.reject(error)
)

// 定义返回数据的类型
type Result<T> = {
  code: HttpStatusCode
  msg?: string
  data?: T
}

// 为了添加参数的类型约束，给service再包裹一层函数
const request = <T = any>(
  url: string,
  method: Method = 'get',
  submitData?: Object,
  config?: AxiosRequestConfig
) =>
  service<T, Result<T>>({
    url,
    method,
    // get请求用params接收，其他请求用data
    [method.toLowerCase() === 'get' ? 'params' : 'data']: submitData,
    ...config
  })

export default request

